﻿using Microsoft.CodeAnalysis.Differencing;
using Microsoft.VisualBasic.Devices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;


#region 文件信息
/****************************************************************
*	公司名称：福建力和行智能科技有限公司
*   作    者：Jeff
*   CLR 版本：4.0.30319.42000
*   创建时间：1/2/2025 2:06:59 PM
*	用 户 名：zheqichen 
*   描述说明：
*
*   修改历史：
*		1）	修 改 人：
*			修改日期：
*			修改内容：			
*
*****************************************************************/
#endregion

namespace Lhxzn.LangExtractor
{
    /// <summary>
    /// 类    名:ContextSearcher
    /// 描    述:语言包内容搜索工具
    /// 修改时间:1/2/2025 2:06:59 PM
    /// </summary>
    public class ContextSearcher
    {
        #region 成员变量

        #region private
        private string m_searchKeyword="";


        #endregion


        #region protected


        #endregion


        #region public
        public class MatchInfo()
        {
            public int Index { get; set; }
            public string LngFileName { get; set; }
            public string SectionName { get; set; }

            public int KeywordIndex { get; set; }

            public string Keyword { get; set; }
        }

        public List<MatchInfo> MatchInfos { get; set; } = new List<MatchInfo>();

        [JsonIgnore]
        public LngFileManager LngFileManager { get; set; }

        public string SearchKeyword
        {
            get {  return m_searchKeyword; }
            set
            {
                if(value!= m_searchKeyword)
                {
                    InitSearching();
                }
                m_searchKeyword = value;
            }
        }

        public string LngFileName { get; set; }
        public string SectionName { get; set; }

        public int SelectedIndex { get; set; } = -1;
        #endregion

        #endregion


        #region 构造函数
        /// <summary>
        /// 函 数 名:构造函数
        /// 函数描述:默认构造函数
        /// 修改时间:1/2/2025 2:06:59 PM
        /// </summary>
        public ContextSearcher(LngFileManager lngFileManager)
        {
            LngFileManager=lngFileManager;
        }
        #endregion

        #region 父类函数重载、接口实现

        #endregion

        #region 函数

        #region private



        #endregion


        #region protected



        #endregion


        #region public
        /// <summary>
        /// 查找上个
        /// </summary>
        /// <returns></returns>
        public MatchInfo SearchLastInSelectedFile()
        {
            if (LngFileManager.CurrentPackage == null || MatchInfos == null)
            {
                return null;
            }

            if (MatchInfos.Count == 0)
            {
                FindAllMatchesInPackage();
            }

            if (MatchInfos.Count == 0)
            {
                return null;
            }

            if (SelectedIndex == -1)
            {
                var currentMath = MatchInfos.FirstOrDefault(item => item.LngFileName == LngFileManager.SelectedLngFileName);
                if (currentMath != null)
                {
                    SelectedIndex = currentMath.Index;
                    return currentMath;
                }
                else
                {
                    SelectedIndex = 0;
                }
            }
            if (SelectedIndex > 0)
                SelectedIndex--;

            return MatchInfos[SelectedIndex];
        }

        /// <summary>
        /// 查找下个
        /// </summary>
        /// <returns></returns>
        public MatchInfo SearchNextInSelectedFile()
        {
            if (LngFileManager.CurrentPackage == null|| MatchInfos==null)
            {
                return null;
            }

            if (MatchInfos.Count == 0)
            {
                FindAllMatchesInPackage();
            }

            if (MatchInfos.Count == 0)
            {
                return null;
            }

            if (SelectedIndex == -1)
            {
                var currentMath = MatchInfos.FirstOrDefault(item => item.LngFileName == LngFileManager.SelectedLngFileName);
                if (currentMath != null)
                {
                    SelectedIndex = currentMath.Index;
                    return currentMath;
                }
                else
                {
                    SelectedIndex = 0;
                }
            }
            if(SelectedIndex< MatchInfos.Count-1)
                SelectedIndex++;

            return MatchInfos[SelectedIndex];
        }

        /// <summary>
        /// 在语言包内查找匹配字符
        /// </summary>
        public void FindAllMatchesInPackage()
        {
            if (LngFileManager.CurrentPackage == null||string.IsNullOrEmpty(SearchKeyword))
            {
                return;
            }

            foreach (var lngFile in LngFileManager.CurrentPackage.LanguageFiles)
            {
                string text = lngFile.GetText().Replace("\r", "");
                int startIndex = 0;
                int keywordIndex = 0;
                while ((keywordIndex = text.IndexOf(SearchKeyword, startIndex))!= -1)
                {
                    MatchInfo match = new MatchInfo()
                    {
                        Index = MatchInfos.Count,
                        LngFileName = Path.GetFileName(lngFile.FilePath),
                        Keyword = SearchKeyword,
                        KeywordIndex = keywordIndex
                    };

                    startIndex = keywordIndex + SearchKeyword.Length;
                    MatchInfos.Add(match);
                }
            }
        }

        /// <summary>
        /// 初始化查找工具
        /// </summary>
        public void InitSearching()
        {
            if (LngFileManager == null)
            {
                return;
            }
            LngFileName = LngFileManager.SelectedLngFileName;
            SectionName = LngFileManager.SelectedSectionName;
            SelectedIndex = -1;
            MatchInfos.Clear();
        }
        #endregion

        #endregion
    }
}
